#ifndef SOCCERTEAM_OWNED_STATES_H
#define SOCCERTEAM_OWNED_STATES_H
//------------------------------------------------------------------------
//
//  Name:   MinerOwnedStates.h
//
//  Desc:   All the states that can be assigned to the Miner class.
//          Note that a global state has not been implemented.
//
//  Author: Mat Buckland 2002 (fup@ai-junkie.com)
//
//------------------------------------------------------------------------
#include "OgreRefAppState.h"
#include "OgreRefAppSoccerTeam.h"

//------------------------------------------------------------------------
//
//  In this state the miner will walk to a goldmine and pick up a nugget
//  of gold. If the miner already has a nugget of gold he'll change state
//  to VisitBankAndDepositGold. If he gets thirsty he'll change state
//  to QuenchThirst
//------------------------------------------------------------------------
namespace OgreRefApp
{

    struct ApplicationObject::CollisionInfo;
    class SoccerTeam;
    class PrepareForKickOff : public State<SoccerTeam>
    {
    private:

        PrepareForKickOff(){}

        //copy ctor and assignment should be private
        PrepareForKickOff(const PrepareForKickOff&);
        PrepareForKickOff& operator=(const PrepareForKickOff&);

    public:

        //this is a singleton
        static PrepareForKickOff* Instance();

        virtual void Enter(SoccerTeam* soccerTeam);

        virtual void Execute(SoccerTeam* soccerTeam);

        virtual void Exit(SoccerTeam* soccerTeam);

        virtual bool OnMessage(SoccerTeam* soccerTeam, ApplicationObject::CollisionInfo& msg){return false;};

    };

    class Defending : public State<SoccerTeam>
    {
    private:

        Defending(){}

        //copy ctor and assignment should be private
        Defending(const Defending&);
        Defending& operator=(const Defending&);

    public:

        //this is a singleton
        static Defending* Instance();

        virtual void Enter(SoccerTeam* soccerTeam);

        virtual void Execute(SoccerTeam* soccerTeam);

        virtual void Exit(SoccerTeam* soccerTeam);

        virtual bool OnMessage(SoccerTeam* soccerTeam, ApplicationObject::CollisionInfo& msg){return false;};

    };

    class Attacking : public State<SoccerTeam>
    {
    private:

        Attacking(){}
        //copy ctor and assignment should be private
        Attacking(const Attacking&);
        Attacking& operator=(const Attacking&);

    public:

      //this is a singleton
      static Attacking* Instance();

      void Enter(SoccerTeam* soccerTeam);

      void Execute(SoccerTeam* soccerTeam);

      void Exit(SoccerTeam* soccerTeam);

      bool OnMessage(SoccerTeam*, ApplicationObject::CollisionInfo&){return false;}
    };
}

#endif;
